package com.example.a20;

import org.springframework.core.MethodParameter;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.yaml.snakeyaml.Yaml;

import javax.servlet.http.HttpServletResponse;

/**
 * 带Yml注解的返回值处理器
 */
public class YmlReturnValueHandler implements HandlerMethodReturnValueHandler {

    /**
     * 判断是否支持处理该返回值
     *
     * @param returnType 要检查的方法返回类型
     * @return true 支持，false 不支持
     */
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        Yml yml = returnType.getMethodAnnotation(Yml.class);
        return yml != null;
    }

    /**
     * 处理返回值
     *
     * @param returnValue  从 handler 方法返回的值 即返回值
     * @param returnType   返回值的类型。此类型必须具有
     * @param mavContainer 当前请求的 ModelAndViewContainer
     * @param webRequest   当前请求
     */
    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType,
                                  ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        // 1. 转换返回结果为 yaml 字符串
        String str = new Yaml().dump(returnType);

        // 2. 将 yaml 字符串写入响应
        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
        response.setContentType("text/plan;charset=utf-8");
        response.getWriter().print(str);

        // 3. 设置请求已经处理完毕
        mavContainer.setRequestHandled(true);
    }
}
